package com.fm.app03.Service.float_service;

import static com.fm.app03.Service.float_service.FloatingWidgetService.float_click_window;
import static com.fm.app03.Service.float_service.FloatingWidgetService.float_window;
import static com.fm.app03.os.MyApplication.instance;
import static com.fm.app03.os.utils.showShortToast;

import android.accessibilityservice.AccessibilityService;
import android.accessibilityservice.GestureDescription;
import android.graphics.Path;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.yhao.floatwindow.FloatWindow;
import java.util.List;

public class MyAccessibilityService extends AccessibilityService {

    public static MyAccessibilityService myAccessibilityService;

    private static final String TAG = "MyAccessibilityService";

    @Override
    public void onCreate() {
        super.onCreate();
        myAccessibilityService = this;
    }

    /* 监听 */
    @Override
    public void onAccessibilityEvent(AccessibilityEvent accessibilityEvent) {
//        findNodeByTextAndClick(accessibilityEvent, "抢");
//        findNodeByIDAndClick(accessibilityEvent, "com.fm.app03:id/switch_button0");
//        printRootInfo(accessibilityEvent);

//        performSwipe();

    }

    /************************************** 滑动 ************************************************/
    // 示例方法：在屏幕上的指定坐标点执行点击操作
    public void clickAtPoint(int x, int y,long t) {
        // 创建一个点击手势的路径
        Path clickPath = new Path();  // 创建一个路径对象
        clickPath.moveTo(x, y);  // 在指定坐标点移动路径到目标位置
        // 创建手势描述
        GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();  // 创建手势描述构建器
        gestureBuilder.addStroke(new GestureDescription.StrokeDescription(clickPath, 0, t));  // 添加手势路径
        // 执行手势
        dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {  // 发送手势
            @Override
            public void onCompleted(GestureDescription gestureDescription) {
                super.onCompleted(gestureDescription);
                // 手势完成后的操作
            }

            @Override
            public void onCancelled(GestureDescription gestureDescription) {
                super.onCancelled(gestureDescription);
                // 手势取消后的操作
            }
        }, null); // 使用null作为Handler，让系统自动选择
    }

    /************************************** 滑动 ************************************************/

    /**
     * 执行滑动操作的方法
     */
    public void performSwipe() {
        // 创建路径对象，定义滑动的起始坐标和终点坐标
        Path path = new Path();
        path.moveTo(500, 1500); // 起始坐标
        path.lineTo(500, 500);  // 终点坐标

        // 创建手势描述的构造器
        GestureDescription.Builder gestureBuilder = new GestureDescription.Builder();

        // 添加手势路径到手势描述中，设置路径、开始时间和持续时间
        gestureBuilder.addStroke(new GestureDescription.StrokeDescription(path, 0, 1));

        // 调用系统的手势分发方法，执行手势
        dispatchGesture(gestureBuilder.build(), new GestureResultCallback() {
            @Override
            public void onCompleted(GestureDescription gestureDescription) {
                super.onCompleted(gestureDescription);
                // 滑动完成后的操作
            }
            @Override
            public void onCancelled(GestureDescription gestureDescription) {
                super.onCancelled(gestureDescription);
                // 滑动取消后的操作

            }
        }, null);
    }


    /************************************** ID获取点击 ************************************************/

    /*通过id获取资源点击*/
    private void findNodeByIDAndClick(AccessibilityEvent accessibilityEvent, String buttonId) {
        if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            // 在这里处理无障碍事件
            Log.i(TAG, "onAccessibilityEvent: 窗口改变！");
            AccessibilityNodeInfo rootNode = getRootInActiveWindow();
            if (rootNode != null) {
                Log.i(TAG, "onAccessibilityEvent: 根节点存在!");
                clickButton(rootNode, buttonId); // 示例：查找一个按钮并点击
                // 记得在使用完节点信息后进行回收
                rootNode.recycle();
            }
        }
    }

    private void clickButton(AccessibilityNodeInfo rootNode, String buttonId) {
        // 使用findAccessibilityNodeInfosByViewId(id)查找按钮
        // 注意：id的格式是 "包名:id/资源名"
        AccessibilityNodeInfo buttonNode = findNodeById(rootNode, buttonId);

        if (buttonNode != null) {
            Log.i(TAG, "onAccessibilityEvent:找到ID资源" + String.valueOf(buttonNode));
            // 执行点击操作
            for (int i = 0; i < 100; i++) {
                buttonNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
            Log.i(TAG, "onAccessibilityEvent:点击完成!");
        } else {
            Log.i(TAG, "onAccessibilityEvent:ID资源为空");
        }
    }

    private AccessibilityNodeInfo findNodeById(AccessibilityNodeInfo rootNode, String targetId) {
        // 使用findAccessibilityNodeInfosByViewId(id)查找节点
        return rootNode.findAccessibilityNodeInfosByViewId(targetId).isEmpty() ?
                null : rootNode.findAccessibilityNodeInfosByViewId(targetId).get(0);
    }

    /************************************* 文本获取点击  *************************************************/

    /*监听点击指定节点*/
    private void findNodeByTextAndClick(AccessibilityEvent accessibilityEvent, String text) {
        if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            //showShortToast(this,"触发了窗口改变");
            Log.i(TAG, "onAccessibilityEvent: 窗口改变");
            // 当窗口状态改变时进行处理，例如打开新的应用程序界面
            AccessibilityNodeInfo rootNode = getRootInActiveWindow();
            if (rootNode != null) {
                Log.i(TAG, "onAccessibilityEvent: 根节点存在!");
                // 查找包含文本 "登录" 的节点
                findAndClickNode(rootNode, text);
                // 记得在使用完节点信息后进行回收
                rootNode.recycle();
            }

        }
    }

    private void findAndClickNode(AccessibilityNodeInfo rootNode, String text) {
        if (rootNode == null) {
            return;
        }
        // 使用 findAccessibilityNodeInfosByText 查找包含指定文本的节点
        AccessibilityNodeInfo targetNode = findNodeByText(rootNode, text);
        if (targetNode != null) {
            Log.i(TAG, "发现了" + text + "节点: " + String.valueOf(targetNode));
            // 执行点击操作或其他操作
            for (int i = 0; i < 100; i++) {
                targetNode.performAction(AccessibilityNodeInfo.ACTION_CLICK);
            }
            Log.i(TAG, "完成点击了！");
            // 记得在使用完节点信息后进行回收
            targetNode.recycle();
        } else {
            Log.i(TAG, "节点为: " + String.valueOf(targetNode));
        }
    }

    private AccessibilityNodeInfo findNodeByText(AccessibilityNodeInfo rootNode, String text) {
        if (rootNode == null) {
            return null;
        }

        // 使用 findAccessibilityNodeInfosByText 查找包含指定文本的节点
        List<AccessibilityNodeInfo> nodes = rootNode.findAccessibilityNodeInfosByText(text);

        if (nodes != null && !nodes.isEmpty()) {
            // 返回找到的第一个节点
            return nodes.get(0);
        }

        return null;
    }

    /************************************ 遍历根节点信息 **************************************************/

    /*遍历根节点信息*/
    private void printRootInfo(AccessibilityEvent accessibilityEvent) {
        if (accessibilityEvent.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED) {
            AccessibilityNodeInfo rootNode = getRootInActiveWindow();
            if (rootNode != null) {
                traverseNode(rootNode);
            }
        }
    }

    private void traverseNode(AccessibilityNodeInfo node) {
        if (node == null) {
            return;
        }

        // 获取节点信息
        String className = node.getClassName().toString();
        String text = node.getText() != null ? node.getText().toString() : "";
        String resourceId = node.getViewIdResourceName();

        // 在这里执行你想要的操作，例如输出信息
        Log.d("Accessibility", "【类名】: " + className + "------------【文本】: " + text + "------------ 【ID】: " + resourceId);
        // 遍历子节点
        for (int i = 0; i < node.getChildCount(); i++) {
            AccessibilityNodeInfo childNode = node.getChild(i);
            traverseNode(childNode);
        }
    }

    /**************************************************************************************/


    /**************************************************************************************/


    /**************************************************************************************/


    /**************************************************************************************/


    @Override
    protected void onServiceConnected() {
        super.onServiceConnected();
        showShortToast(this, "无障碍服务接入");
        float_window(instance);


    }


    @Override
    public void onInterrupt() {

    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        showShortToast(this, "无障碍服务脱离");
        FloatWindow.destroy("new");
        FloatWindow.destroy("new_0");
    }
}